/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.cip.esymons.sistemas.beans;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.cip.esymons.general.adapters.EmpleadoAdapter;
import org.cip.esymons.sistemas.bc.detalleRequerimientoDelegate;
import org.cip.esymons.sistemas.bc.empleadoDelegate;
import org.cip.esymons.sistemas.bc.requerimientoDelegate;
import org.cip.esymons.sistemas.be.SisDetalleRequerimiento;
import org.cip.esymons.sistemas.be.SisRequerimiento;

/**
 *
 * @author WILLIAM
 */
public class requerimientoController {

    //DECLARACION DE VARIABLES.
    private detalleRequerimientoDelegate delegadoDetalle;
    private requerimientoDelegate delegadoRequerimiento;
    private empleadoDelegate delegadoEmpleado;
  
    private SisRequerimiento requerimiento;
    private SisDetalleRequerimiento detalleRequerimiento;
    private EmpleadoAdapter destinatario,areaDestino;

    List<SisRequerimiento> listaRequerimientos;
    List<SisRequerimiento> listaRequerimientosArea;
    List<SisDetalleRequerimiento> listaDetalleRequerimiento;

    private String cantidadDetalle,area,nombre,areaLaboral;
    private String cantidadReque,limpia;
    private Boolean activar,mostrar,verBusqueda,verDetalles;
    private Integer opcion;
    private Date fecha;

    //CONSTRUCTOR.
    public requerimientoController() {

        delegadoDetalle =  new detalleRequerimientoDelegate();
        delegadoRequerimiento = new requerimientoDelegate();
        delegadoEmpleado = new empleadoDelegate();
        
        requerimiento = new SisRequerimiento();
        detalleRequerimiento = new SisDetalleRequerimiento();
        
        listaDetalleRequerimiento = new ArrayList<SisDetalleRequerimiento>();
        listaRequerimientos = new ArrayList<SisRequerimiento>();
        listaRequerimientosArea = new ArrayList<SisRequerimiento>();
        listaRequerimientos = null;
        listaRequerimientosArea = null;
        listaDetalleRequerimiento = null;
        
        activar = false;
        mostrar = false;
        verBusqueda = false;
        verDetalles = false;
    }
//GETTER AND SETTER DE LAS VARIABLES
    public EmpleadoAdapter getAreaDestino() {
        return areaDestino;
    }

    public void setAreaDestino(EmpleadoAdapter areaDestino) {
        this.areaDestino = areaDestino;
    }

    public String getAreaLaboral() {
        return areaLaboral;
    }

    public void setAreaLaboral(String areaLaboral) {
        this.areaLaboral = areaLaboral;
    }

    public EmpleadoAdapter getDestinatario() {
        return destinatario;
    }

    public void setDestinatario(EmpleadoAdapter destinatario) {
        this.destinatario = destinatario;
    }

    public empleadoDelegate getDelegadoEmpleado() {
        return delegadoEmpleado;
    }

    public void setDelegadoEmpleado(empleadoDelegate delegadoEmpleado) {
        this.delegadoEmpleado = delegadoEmpleado;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public Boolean getVerDetalles() {
        return verDetalles;
    }

    public void setVerDetalles(Boolean verDetalles) {
        this.verDetalles = verDetalles;
    }

    public Boolean getVerBusqueda() {
        return verBusqueda;
    }

    public void setVerBusqueda(Boolean verBusqueda) {
        this.verBusqueda = verBusqueda;
    }

    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public Integer getOpcion() {
        return opcion;
    }

    public void setOpcion(Integer opcion) {
        this.opcion = opcion;
    }

    public List<SisRequerimiento> getListaRequerimientosArea() {
        return listaRequerimientosArea;
    }

    public void setListaRequerimientosArea(List<SisRequerimiento> listaRequerimientosArea) {
        this.listaRequerimientosArea = listaRequerimientosArea;
    }

    public String getArea() {
        return area;
    }

    public void setArea(String area) {
        this.area = area;
    }

    public String getLimpia() {
        inicializa();
        return "";
    }

    public void setLimpia(String limpia) {
     
    }

    public Boolean getMostrar() {
        return mostrar;
    }

    public void setMostrar(Boolean mostrar) {
        this.mostrar = mostrar;
    }

    public Boolean getActivar() {
        return activar;
    }

    public void setActivar(Boolean activar) {
        this.activar = activar;
    }

    public String getCantidadDetalle() {
        return cantidadDetalle;
    }

    public void setCantidadDetalle(String cantidadDetalle) {
        this.cantidadDetalle = cantidadDetalle;
    }

    public String getCantidadReque() {
        return cantidadReque;
    }

    public void setCantidadReque(String cantidadReque) {
        this.cantidadReque = cantidadReque;
    }

    public List<SisDetalleRequerimiento> getListaDetalleRequerimiento() {
        return listaDetalleRequerimiento;
    }

    public void setListaDetalleRequerimiento(List<SisDetalleRequerimiento> listaDetalleRequerimiento) {
        this.listaDetalleRequerimiento = listaDetalleRequerimiento;
    }

    public List<SisRequerimiento> getListaRequerimientos() {
        return listaRequerimientos;
    }

    public void setListaRequerimientos(List<SisRequerimiento> listaRequerimientos) {
        this.listaRequerimientos = listaRequerimientos;
    }

    public detalleRequerimientoDelegate getDelegadoDetalle() {
        return delegadoDetalle;
    }

    public void setDelegadoDetalle(detalleRequerimientoDelegate delegadoDetalle) {
        this.delegadoDetalle = delegadoDetalle;
    }

    public requerimientoDelegate getDelegadoRequerimiento() {
        return delegadoRequerimiento;
    }

    public void setDelegadoRequerimiento(requerimientoDelegate delegadoRequerimiento) {
        this.delegadoRequerimiento = delegadoRequerimiento;
    }

    public SisDetalleRequerimiento getDetalleRequerimiento() {
        return detalleRequerimiento;
    }

    public void setDetalleRequerimiento(SisDetalleRequerimiento detalleRequerimiento) {
        this.detalleRequerimiento = detalleRequerimiento;
    }

    public SisRequerimiento getRequerimiento() {
        return requerimiento;
    }

    public void setRequerimiento(SisRequerimiento requerimiento) {
        this.requerimiento = requerimiento;
    }

//IR A UN NUEVO REQUERIMIENTO
    public String nuevo(){

        requerimiento = new SisRequerimiento();
        detalleRequerimiento = new SisDetalleRequerimiento();
        return "nuevo";
    }
// IR A EDITAR REQUERIMIENTO
    public String editar(){

        return "editar";
    }   

 //REMOVER REQUERIMIENTO
    public String remover(){

        delegadoDetalle.remove(detalleRequerimiento);
        detalleRequerimiento = new SisDetalleRequerimiento();
        mostrarMensaje("INFO: ", "Su requerimiento fue removido...", FacesMessage.SEVERITY_INFO);
        listarDetallesRequerimiento();
        return null;
    }
//RETORNAR A UNA VENTANA ANTERIOR LIMPIANDO LOS VALORES
    public String retornar(){

        requerimiento = new SisRequerimiento();
        detalleRequerimiento = new SisDetalleRequerimiento();
        activar = false;
        return "listar";
    }
//ANULAR EL PROCESO.
    public String cancelar(){
        
        requerimiento = new SisRequerimiento();
        detalleRequerimiento = new SisDetalleRequerimiento();
        activar = false;
        
        return null;
    }

  //REGISTRO DE LA SOLICITUD DE REQUERIMIENTO.(CABECERA)
    public String registrarsolicitud(){

        try{
            Date date = new Date(System.currentTimeMillis());
            String hora = (date.getHours()+":"+date.getMinutes()+":"+date.getSeconds());
            requerimiento.setReqEstado(0);
            requerimiento.setReqFecha(new Date());
            requerimiento.setReqHoraIngreso(hora);
            delegadoRequerimiento.create(requerimiento);
            activar = true;
            listaDetalleRequerimiento = null;
            cantidadDetalle = "";
            return null;
        }catch(Exception ex){
            return null;
        }
    }

    //REGISTRO DEL DETALLE DEL REQUERIMIENTO(REGISTRA TODOS LOS DETALLES QUE PUEDA CONTENER UN REQUERIMIENTO)
    public String registraDetalle(){

        try{
            if(detalleRequerimiento.getDetPrioridad().isEmpty()){
                detalleRequerimiento.setDetPrioridad("Normal");
            }
            detalleRequerimiento.setDetFechaRegistro(new Date());
            detalleRequerimiento.setReqCodigo(requerimiento);
            detalleRequerimiento.setDetEstado(0);
            detalleRequerimiento.setDetAtendidoPor("R. Purizaca P.");
            delegadoDetalle.create(detalleRequerimiento);
            mostrarMensaje("INFO: ", "Se registro su requerimiento ...", FacesMessage.SEVERITY_INFO);
            listarDetallesRequerimiento();
            detalleRequerimiento = new SisDetalleRequerimiento();
            return null;
        }catch(Exception ex){
            return null;
        }

    }

    //LISTADO DE LOS DETALLES DE UN REQUERIMIENTO.
    public List<SisDetalleRequerimiento> listarDetallesRequerimiento(){

        try{
            cantidadDetalle = "";
            listaDetalleRequerimiento = new ArrayList<SisDetalleRequerimiento>();
            listaDetalleRequerimiento = delegadoDetalle.listaPorRequerimiento(requerimiento.getReqCodigo());
            cantidadDetalle = "Existen "+listaDetalleRequerimiento.size()+ " Requerimientos";
            return listaDetalleRequerimiento;
        }catch(Exception ex){
            listaDetalleRequerimiento = new ArrayList<SisDetalleRequerimiento>();
            return null;
        }
    }
//LISTADO GENERALES DE LOS REQUERIMIENTOS INGRESADOS A SER ATENDIDOS.
    public List<SisRequerimiento> getlistarRequerimientos(){

        try {
            cantidadReque = "";
            listaRequerimientos = new ArrayList<SisRequerimiento>();
            listaRequerimientos = delegadoRequerimiento.listarRequerimientoRecibidos();
            cantidadReque = "Exiten "+listaRequerimientos.size()+" Solicitudes";
            return listaRequerimientos;
        } catch (Exception ex) {
            listaRequerimientos = new ArrayList<SisRequerimiento>();
            mostrarMensaje("ADVERTENCIA: ", "No hay solicitudes de requerimientos...", FacesMessage.SEVERITY_WARN);
            return null;

        }
    }
//METODO QUE MUESTRA LOS DETALLES QUE PUEDA CONTENER UN REQUERIMIENTO
    public String mostrardetalle(){

        mostrar = true;
        listarDetallesRequerimiento();
        return null;
    }
//OCULTA LOS DETALLES QUE PUEDA CONTENER UN REQUERIMIENTO
    public String ocultarDetalle(){

        actualizaEstadoRequerimiento();
        mostrar = false;
        inicializa();
        getlistarRequerimientos();

        return null;
    }
 //METODO QUE DERIVA UN REQUERIMIENTO A LA PERSONA INDICADA A ATENDERLO.
    public String derivarRequerimiento(){

        try {
            if(listaDetalleRequerimiento.size()>0){
                for(SisDetalleRequerimiento detalle : listaDetalleRequerimiento){
                        detalle.setDetEstado(1);
                        delegadoDetalle.edit(detalle);

                }
                requerimiento.setReqEstado(1);
                delegadoRequerimiento.edit(requerimiento);

                mostrarMensaje("INFO: ", "Requerimientos derivados satisfactoriamente...", FacesMessage.SEVERITY_INFO);
            }else{
              mostrarMensaje("ADVERTENCIA: ", "No hay requerimiento por atender...", FacesMessage.SEVERITY_WARN);  
            }
            return null;
        } catch (Exception e) {
            mostrarMensaje("ADVERTENCIA: ", "Se produjo un error...", FacesMessage.SEVERITY_WARN);
            return null;
        }
    }
//METODO QUE PERMITE ACTUALIZAR EL ESTADO EN QUE SE ENCUENTRA UN REQUERIMIENTO(EN ESTE CASO A ATENDIDO)
    public String atenderRequerimiento(){

        try {
            detalleRequerimiento.setDetFechaAtencion(new Date());
            detalleRequerimiento.setDetEstado(2);
            delegadoDetalle.edit(detalleRequerimiento);
            detalleRequerimiento = new SisDetalleRequerimiento();
            mostrarMensaje("INFO: ", "Requerimientos atendido satisfactoriamente...", FacesMessage.SEVERITY_INFO);
            return null;
        } catch (Exception e) {
            return null;
        }

    }
//METODO QUE PERMITE ACTUALIZAR EL ESTADO EN QUE SE ENCUENTRA UN REQUERIMIENTO(EN ESTE CASO A RECHAZADO)
    public String rechazarRequerimiento(){

        try {
            detalleRequerimiento.setDetFechaAtencion(new Date());
            detalleRequerimiento.setDetEstado(3);
            delegadoDetalle.edit(detalleRequerimiento);
            detalleRequerimiento = new SisDetalleRequerimiento();
            mostrarMensaje("INFO: ", "Requerimientos rechazado satisfactoriamente...", FacesMessage.SEVERITY_INFO);
            return null;
        } catch (Exception e) {
            return null;
        }

    }
//METODO QUE PERMITE ACTUALIZAR EL ESTADO A TODOS LOS DETALLES DE UN REQUERIMIENTO
    public String actualizaEstadoRequerimiento(){

        try {
             Integer contadorOK = 0;
             Integer contadorNO = 0;
             Integer tamañoLista = 0;
             tamañoLista = listaDetalleRequerimiento.size();
             for(SisDetalleRequerimiento detalle : listaDetalleRequerimiento){
                 if(detalle.getDetEstado()==2){
                     contadorOK = contadorOK + 1;
                 }
                 if(detalle.getDetEstado()==3){
                     contadorNO = contadorNO + 1;
                 }
             }
             if(contadorOK == tamañoLista || contadorNO < tamañoLista){
                 requerimiento.setReqEstado(2);                 
                 delegadoRequerimiento.edit(requerimiento);
             }
             if(contadorNO == tamañoLista){
                 requerimiento.setReqEstado(3);
                 delegadoRequerimiento.edit(requerimiento);
             }

            return null;
        } catch (Exception e) {
            return null;
        }
    }
//INICIALIZA LOS VALORES
    public void inicializa(){

        delegadoDetalle =  new detalleRequerimientoDelegate();
        delegadoRequerimiento = new requerimientoDelegate();

        requerimiento = new SisRequerimiento();
        detalleRequerimiento = new SisDetalleRequerimiento();

        listaDetalleRequerimiento = new ArrayList<SisDetalleRequerimiento>();
        listaRequerimientos = new ArrayList<SisRequerimiento>();
        listaRequerimientosArea = new ArrayList<SisRequerimiento>();
        listaRequerimientos = null;
        listaRequerimientosArea = null;
        listaDetalleRequerimiento = null;

        activar = false;
        mostrar = false;
        verBusqueda = false;
        verDetalles = false;
    }
//MUESTRA LA LISTA DE REQUERIMIENTOS POR AREA, FECHA O AREA Y FECHA
    public String buscarporArea(){

        try {
            if(opcion == 0){
                mostrarMensaje("ADVERTENCIA: ", "Seleccione un tipo de busqueda...", FacesMessage.SEVERITY_WARN);
            }
            listaRequerimientosArea = new ArrayList<SisRequerimiento>();
            switch(opcion){

                case 1: listaRequerimientosArea = delegadoRequerimiento.listarRequerimientoXArea(area);
                        cantidadReque = "Exiten "+listaRequerimientosArea.size()+" Solicitudes";
                        break;
                case 2: listaRequerimientosArea = delegadoRequerimiento.listarRequerimientoXFecha(fecha);
                        cantidadReque = "Exiten "+listaRequerimientosArea.size()+" Solicitudes";
                        break;
                case 3: listaRequerimientosArea = delegadoRequerimiento.listarRequerimientoXAreayFecha(area, fecha);
                        cantidadReque = "Exiten "+listaRequerimientosArea.size()+" Solicitudes";
                        break;
            }
            verBusqueda = true;
            area = " ";
            fecha = null;
            opcion = 0;
            return null;
        } catch (Exception e) {
            mostrarMensaje("ADVERTENCIA: ", "Seleccione un tipo de busqueda...", FacesMessage.SEVERITY_WARN);
            listaRequerimientosArea = null;
            area = " ";
            fecha = null;
            opcion = 0;
            verBusqueda = false;
            verDetalles = false;
            return null;
        }
    }

    public String terminar(){

        listaRequerimientosArea = null;
        area = " ";
        fecha = null;
        opcion = 0;
        verBusqueda = false;
        verDetalles = false;
        return null;
    }

    public String verdetalle(){

        verBusqueda = false;
        verDetalles = true;
        listarDetallesRequerimiento();
        return null;
    }

    public String cerrarDetalle(){

        verBusqueda = true;
        verDetalles = false;
        return null;
    }

    //suggestion box de empleados

    public List<EmpleadoAdapter> autocompletarDestinatarios(Object event) {
        List<EmpleadoAdapter> lista = new ArrayList();
        String cond = event.toString().toUpperCase();
        try {
            lista = delegadoEmpleado.listarDestinatarioDocumento(cond);
        } catch (Exception ex) {
        }
        return lista;
    }

    //METODO QUE PERMITE CAPTURAR EL RESPONSABLE DEL AREA
    public String agregarDestin() {
        try {
            requerimiento.setReqSolicitante(destinatario.getNombre());
            requerimiento.setReqArea(destinatario.getArea().getAreNombre());

        } catch (Exception e) {
            return "";
        }
        return "";
    }

    //SUGESTION BOX QUE MUESTRA LAS AREAS
    public List<EmpleadoAdapter> autocompletarArea(Object event) {
        List<EmpleadoAdapter> lista = new ArrayList();
        String cond = event.toString().toUpperCase();
        try {
            lista = delegadoEmpleado.listarDestinatarioDocumento(cond);
        } catch (Exception ex) {
        }
        return lista;
    }

    //METODO QUE PERMITE CAPTURAR EL NOMBRE DEL AREA
    public String agregarArea() {
        try {
            requerimiento.setReqArea(destinatario.getArea().getAreNombre());

        } catch (Exception e) {
            return "";
        }
        return "";
    }

    //METODO QUE NOS MUESTRA MENSAJES DE ERROR, EXITO O ADVERTENCIA
    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }


}
